package Controller;
import java.sql.*;


public class BancoDeDados {

    Connection connection;
    String sql;
    PreparedStatement comandoSql;
    public static final String bdUrl = new String("jdbc:postgresql://localhost:5433");
    public static final String bdUsuario = new String("postgres");
    public static final String bdSenha = new String("123456");

    /**
     * Construtor do Banco de Dados
     *
     * @param url
     * @param usuario
     * @param senha
     */
    public BancoDeDados() {
        connection = null;
        sql = null;
        comandoSql = null;
    }

    /**
     * Carregar o drive o Banco de Dados
     *
     * @throws java.lang.Exception
     */
    public void carregarDriver()
            throws Exception {

        Class.forName("org.h2.Driver");
    }

    /** Conectar ao Banco de Dados
     *
     * @param url - diretorio do driver do banco de dados
     * @param usuario - nome do usuario que vai fazer login no banco de dados
     * @param senha - senha de usuario
     * @throws Exception
     */
    public void conectar()
            throws Exception {

        connection = DriverManager.getConnection(this.bdUrl, this.bdUsuario, this.bdSenha);
    }

    /**
     * Fecha a conexao com o Banco de Dados
     *
     * @throws java.lang.Exception
     */
    public void desconectar() throws Exception {
        comandoSql.close();
        sql = null;
        connection.close();
    }

    /**
     * Cria uma tabela dentro de um banco de dados
     *
     * @param nome - nome da tabela
     * @param parametros - nomes das colunas
     * @param tipos - tipos das colunas
     * @throws java.lang.Exception
     */
    public void criarTabela(String nome, String[] parametros, String[] tipos)
            throws Exception {

        if (parametros.length == tipos.length) {
            sql = "CREATE TABLE " + nome + " (";

            int i;
            for (i = 0; i < parametros.length - 1; i++) {
                sql += parametros[i] + " " + tipos[i] + ", ";
            }
            sql += parametros[i] + " " + tipos[i] + ")";

            comandoSql = connection.prepareStatement(sql);
            comandoSql.executeUpdate();
        } else {
            throw new Exception("Array de parametros com tamanho diferente" +
                    " de array de tipos.");
        }
    }

    /**
     * Cria uma tabela dentro de um banco de dados
     *
     * @param nome - nome da tabela
     * @param parametros - nomes das colunas
     * @param tipos - tipos das colunas
     * @throws java.lang.Exception
     */
    public void criarTabela(String nome, String[] parametros,
            String[] tipos, String[] chaveEstrangeira)
            throws Exception {

        if (parametros.length == tipos.length) {
            sql = "CREATE TABLE " + nome + " (";

            int i;

            //adiciona os par�metros e os tipos
            for (i = 0; i < parametros.length; i++) {
                sql += parametros[i] + " " + tipos[i] + ", ";
            }

            //adiciona a chave estrangeira
            for (i = 0; i < chaveEstrangeira.length - 1; i++) {
                sql += chaveEstrangeira[i] + ", ";
            }
            sql += chaveEstrangeira[i] + ")";

            System.out.println("Debug: " + sql);
            comandoSql = connection.prepareStatement(sql);
            comandoSql.executeUpdate();
        } else {
            throw new Exception("Array de parametros com tamanho diferente" +
                    " de array de tipos.");
        }
    }

    /**
     * Elimina uma tabela do banco de dados.
     *
     * @param nome Nome da tabela
     * @param ifexists true para verificar se existe a tabela antes de elimina-la
     * @throws Exception
     */
    public void deletarTabela(String nome, boolean ifExists)
            throws Exception {

        if (ifExists) {
            comandoSql = connection.prepareStatement(
                    "DROP TABLE IF EXISTS " +
                    nome);
        } else {
            comandoSql = connection.prepareStatement(
                    "DROP TABLE " +
                    nome);
        }

        comandoSql.executeUpdate();
    }

    /**
     *
     * @param nomeTabela
     * @return
     * @throws java.lang.Exception
     */
    public ResultSet selectAll(String nomeTabela)
            throws Exception {

        comandoSql = connection.prepareStatement(
                "SELECT * FROM " +
                nomeTabela);

        return comandoSql.executeQuery();
    }
}

